package me.myqaq.myqaqcraft.slimefunaddon;

import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent;
import io.github.thebusybiscuit.slimefun4.api.researches.Research;
import io.github.thebusybiscuit.slimefun4.core.attributes.Radioactive;
import io.github.thebusybiscuit.slimefun4.core.attributes.Radioactivity;
import io.github.thebusybiscuit.slimefun4.core.attributes.WitherProof;
import io.github.thebusybiscuit.slimefun4.core.handlers.BlockUseHandler;
import io.github.thebusybiscuit.slimefun4.core.handlers.ItemUseHandler;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunItems;
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
import me.myqaq.myqaqcraft.slimefunaddon.tasks.itemReg;
import me.myqaq.myqaqcraft.slimefunaddon.tow.PlayerJoin;
import me.myqaq.myqaqcraft.slimefunaddon.utils.Bitem;
import me.myqaq.myqaqcraft.slimefunaddon.utils.CDreg;
import me.myqaq.myqaqcraft.slimefunaddon.utils.CU;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.block.Block;
import org.bukkit.entity.Wither;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;

import io.github.thebusybiscuit.slimefun4.api.items.ItemGroup;
import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem;
import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItemStack;
import io.github.thebusybiscuit.slimefun4.api.recipes.RecipeType;
import io.github.thebusybiscuit.slimefun4.api.SlimefunAddon;
import io.github.thebusybiscuit.slimefun4.libraries.dough.config.Config;
import io.github.thebusybiscuit.slimefun4.libraries.dough.items.CustomItemStack;

import javax.annotation.Nonnull;
import java.util.logging.Logger;

public class MyQaqCraft extends JavaPlugin implements SlimefunAddon {
    private Logger logget;
    private static MyQaqCraft instance;



    @Override
    public void onEnable() {
        // 从 config.yml 中读取插件配置
        Config cfg = new Config(this);
        registerConfig();
        // if (cfg.getBoolean("options.auto-update")) {
        //   // 你可以在这里添加自动更新功能
        // }
        logget =getLogger();
        instance=this;
        logget.info("==================");
        logget.info("MyQAQ粘液附属启动成功");
        logget.info("MyQAQ粘液附属启动成功");
        logget.info("==================");
        // 在开始的时候注册子类
        getServer().getPluginManager().registerEvents(new PlayerJoin(),this);
        // 调用分类注册
        CDreg.init();
        // 调用物品类注册
        Bitem.init();
        // 调用物品经验锁定注册
        itemReg.run();

        /*
         * 1. 创建分类
         * 分类的显示物品将使用以下物品
         */
        //ItemStack itemGroupItem = new CustomItemStack(SlimefunUtils.getCustomHead("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODYxZDNlMDk5Yjk5Y2RlNGUwNDI4OWZlMWRhNzhjN2MxOTcxZWMyMjUzNzRkZmQ4MzM4YWQ2ZDkxZTZkN2I0In19fQ=="), "&cMyQAQ");

        // 111111
        // 创建一个物品分类 叫Dg  物品是 Material.CAKE 赋给变量dangao 一般一个分类就够了 也叫分类基本信息 给分类设置了 图标和名字
        // ItemStack dangao = new CustomItemStack(Material.CAKE, "&4Dg");

        // 给你的分类提供一个独一无二的ID
       // NamespacedKey itemGroupId = new NamespacedKey(this, "qaq_category");
        //ItemGroup itemGroup = new ItemGroup(itemGroupId, itemGroupItem);

        // 222222
        // 给创建的分类提供id 分类id为 qaq_dg  第二句再把id和分类信息结合组合成一个带id的分类信息 dangaodata  两个参数 第一个是刚给分类提供的id 第二个是之前创建的分类基本信息
        // NamespacedKey dangaoid = new NamespacedKey(this, "qaq_dg");
        // ItemGroup dangaodata = new ItemGroup(dangaoid, dangao);

        /*
         * 2. 创建一个 SlimefunItemStack
         * 这个类是 ItemStack 的扩展，拥有多个构造函数
         * 重要：每个物品都得有一个独一无二的ID
         */
        //SlimefunItemStack slimefunItem = new SlimefunItemStack("QAQ_DIAMOND", Material.DIAMOND, "&4很牛逼的钻石", "","&c很牛逼，牛逼到可以当普通钻石用");

        // 333333
        // 创建一个物品  赋给变量 dangaoItem                     物品的id：QAQ_DG 创建的物品是原版那个东西 CAKE 蛋糕    创建的物品的名字：神奇蛋糕   lore：多功能用途
        //SlimefunItemStack dangaoItem = new SlimefunItemStack("QAQ_DG", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTliZTI0ZjVlYmMyZTBlNGQ2Y2NjNzQ5NmFkMTY3MThkZDdiNTNhNDlkMTNjMjYyMjcwMWEyZmY0YTVhZTNjNiJ9fX0=", "&d神奇蛋糕", "","&c多功能用途,但很危险","&8该蛋糕被凋零攻击有概率会召唤神奇力量秒杀凋零");

        /*
         * 3. 创建配方
         * 这个配方是一个拥有9个ItemStack的数组。
         * 它代表了一个3x3的有序合成配方。
         * 该配方所需的机器将在后面通过RecipeType指定。
         */
        //ItemStack[] recipe = {
        //        new ItemStack(Material.EMERALD), null, new ItemStack(Material.EMERALD),
        //        null, new ItemStack(Material.DIAMOND), null,
        //        new ItemStack(Material.EMERALD), null, new ItemStack(Material.EMERALD)
        //};

        // 444444
        // 设置蛋糕配方 名字叫 dangaopf  3*3配方
        //ItemStack[] dangaopf = {
        //        new ItemStack(Material.EMERALD), null, new ItemStack(Material.EMERALD),
        //        SlimefunItems.CARBONADO, SlimefunItems.CARBONADO, SlimefunItems.CARBONADO,
        //        new ItemStack(Material.EMERALD), null, new ItemStack(Material.EMERALD)
        //};
        /*
         * 4. 注册物品
         * 现在，你只需要注册物品
         * RecipeType.ENHANCED_CRAFTING_TABLE 代表
         * 该物品将在增强型工作台中合成。
         * 来自粘液科技本体的配方类型将会自动将配方添加到对应的机器中。
         */
        //SlimefunItem item = new SlimefunItem(itemGroup, slimefunItem, RecipeType.ENHANCED_CRAFTING_TABLE, recipe);
        //item.register(this);

        // 注册物品 物品的注册数据给变量 Cake 四个参数  第一个是包含id的物品分类 第二个是创建的物品变量 第三个是在哪个机器制作 第四个是配方 然后下面紧跟一个注册方法
        // 赋值变量可以给到以后创建的方法
        //FireCake  Cake= new FireCake(itemGroup, dangaoItem, RecipeType.ENHANCED_CRAFTING_TABLE, dangaopf);
        // 注册
        //Cake.register(this);
        // 添加解锁经验
        //NamespacedKey researchKey = new NamespacedKey(this, "fire_cake");
        //Research xpCake = new Research(researchKey, 182201, "好吃好玩的蛋糕", 20);
        //xpCake.addItems(Cake);
        //xpCake.register();
    }

    /*创建自定义类 把类看作是对象的模版。SlimefunItem类基本上就是我们将要创建的任何物品的模版。
    现在我们创建了自己的类，这就是一个全新的对象模版。但是我们可以扩展SlimefunItem模版，这将确保使用我们的类创建的物品具有与SlimefunItem类创建的物品相同的功能。
    我们希望我们的FireCake类扩展SlimefunItem类，使其继承自该类。
    为此，我们使用extends关键字，后面跟着父类（SlimefunItem）。注意，任何类只能有一个父类。*/
//    public class FireCake extends SlimefunItem implements Radioactive, WitherProof {
//
//        // 创建构造函数 用super来继承主类里定义的物品的参数 继承给FireCake
//
//        public FireCake(ItemGroup itemGroup, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
//            super(itemGroup, item, recipeType, recipe);
//        }
//        // 定义 Radioactive 接口中的 getRadioactivity() return返回一个辐射伤害
//        @Override
//        public Radioactivity getRadioactivity(){
//            return Radioactivity.HIGH;
//        }
//        // WitherProof 防凋零  当被凋零攻击的话执行什么
//        @Override
//        public void onAttack(@Nonnull Block block,@Nonnull Wither wither) {
//            wither.setHealth(0);
//        }
//        /*
//        你可以添加任意数量的物品处理器，但是要小心，有些处理器有非常严格的要求。
//        例如，你只能将BowShootingHandler添加到弓上，而不能添加到其他任何物品上。
//        现在，我们找到preRegister()方法。
//         */
//        // 定义一个方法 物品处理逻辑 一个来自SlimefunItem的方法，叫做preRegister()。
////        @Override
////        public void preRegister() {
////            // 我们将在此处添加物品处理器
////            /*
////            我们将要选择的物品处理器是：BlockUseHandler，当玩家右键点击我们的方块时，将会调用BlockUseHandler。 类似的，ItemUseHandler在玩家手持该物品右键点击时被调用。
////            首先，我们声明一个新的BlockUseHandler。
////            但是不要在右边写任何东西。
////            然后，我们可以通过调用addItemHandler(...)来添加我们的处理器。
////            */
////            //                          调用当前实例下的事件  事件名自定义
////            BlockUseHandler blockUseHandler=this::onBlockRightClick;
////            addItemHandler(blockUseHandler);
////
////            ItemUseHandler itemUseHandler=this::onItemUseRightClick;
////            addItemHandler(itemUseHandler);
////        }
//        // 定义一个方法 做物品在地上右键单击事件 事件名onBlockRightClick 自定义
////        private void onBlockRightClick(PlayerRightClickEvent event){
////            // event 事件触发对象  该对象不是玩家 再这里是蛋糕 如果你自定义别的物品就是别的物品
////            // 阻止玩家食用蛋糕 event.cancel()其实是阻止默认事件 吃蛋糕事件阻止了也就吃不俩了😊
//////            event.cancel();
////            // 设置玩家着火5s event.getPlayer() 触发事件的对象  方法链调用setFireTicks(5*20) n*m n倍数 m是mc刻 20刻一秒
////          int ello =  event.getPlayer().getLevel();
////          // System.out.println("提示"+ello);
////            // 减少玩家1级经验
////            if ( ello>=30){
////                    event.getPlayer().giveExpLevels(-30);
////                    event.getPlayer().setFireTicks(5*20);
////                    event.getPlayer().sendMessage("§4谁让你摸我的！！！");
////            }else{
////                    event.getPlayer().sendMessage("§4he~呸！30级经验都没有！死~杂~鱼~");
////                    event.getPlayer().setHealth(0);
////            }
////        }
//
//        // 定义一个方法 做物品在手里右键单击事件 事件名onItemUseRightClick 自定义
////        private void onItemUseRightClick(PlayerRightClickEvent event) {
////            // 如果在这里调用 event.cancel() 会阻止玩家放置蛋糕
////            event.getPlayer().giveExpLevels(1);
////            event.getPlayer().sendMessage("§a给你一点经验。偷着乐吧");
////
////        }
//
//
//
//    }
    @Override
    public void onDisable() {
        // 禁用插件的逻辑...
        logget.info("MyQAQ粘液附属卸载成功");
        logget =null;
    }

    @Override
    public String getBugTrackerURL() {
        // 你可以在这里返回你的问题追踪器的网址，而不是 null
        return null;
    }

    @Override
    public JavaPlugin getJavaPlugin() {
        /*
         * 你需要返回对你插件的引用。
         * 如果这是你插件的主类，只需要返回 "this" 即可。
         */
        return this;
    }

    // 注册 config 文件
        private void registerConfig(){
            saveDefaultConfig();
        }

    // 把主类this 赋给instance 然后给个公开函数
    public static MyQaqCraft getInstance() {
        return instance;
    }

}
